package com.itheima.weiding;

public class LeetCode260 {

    //给你一个整数数组 nums，其中恰好有两个元素只出现一次，其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
    //
    //你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

    public int[] singleNumber(int[] nums) {
        //1.所有数异或的结果一定是这两个元素的异或结果，其中一定有至少一位为1，这一位上两数必定不同
        //2.将所有数分为那一位为1和那一位不为1的两组，其中的数全都异或后一定能得到两数其中之一
        //3.再用两数异或结果异或两数其一便能得到另一个数
        int vor = 0;
        int a = 0;
        for (int num : nums) {
            vor ^= num;
        }
        //取最右侧的1
        int rightest = vor & (~vor + 1);

        for (int num : nums) {
            //取响应位置为0的数，1 and 0 = 0
            if((num & rightest) == 0){
                a ^= num;
            }
        }

        return new int[]{a, vor ^ a};
    }
}
